有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在java中如何划分重复的正则表达式模式?

想象一下,有一行字符串是这样的:

" jack for { 123 for{}} rose for {}"

我想把它分开,得到这两行作为输出:

jack   for { 123 for{}}   
rose for {} 

下面的正则表达式模式不能解决这个问题,我现在不知道贪婪量词应该放在哪里:
[\S\s]*(for)\s*\{[\S\s]*}

任何形式的帮助都将不胜感激


共 (2) 个答案

  1. # 1 楼答案

    我会避免使用regex来完成该任务,而是实现一个简单的解析器:

    Scanner sc = new Scanner("  jack   for { 123 for{}} rose for {}");
    sc.useDelimiter("");
    List<String> resultingParts = new ArrayList<>();
    int currentNestingDepth=0;
    StringBuilder currentPart= new StringBuilder();
    while (sc.hasNext()) {
        char c = sc.next().charAt(0);
        if (c == '{') { currentNestingDepth++; }
        else if (c == '}') {
            currentNestingDepth ; //!\\ might fail with unbalanced parens, test > 0 if needed
    
            if (currentNestingDepth == 0) { //we've reached the end of a part
                currentPart.append(c);
                resultingParts.add(currentPart.toString());
                currentPart = new StringBuilder();
                continue; // to avoid adding the current character yet again
            }
        }
       currentPart.append(c);
    }
    if (currentPart.length() > 0) { resultingParts.add(currentPart.toString()); }
    

    你可以try it here

  2. # 2 楼答案

    假设外部名称始终为“单词”,内部字符串始终为数字,则可行的正则表达式为:

    \s*\w+\s*for\s*\{(\s*\d+\s*for\s*\{.*\})*\}
    

    https://regex101.com/r/V3MNFd/1